package cn.tedu.csmall.commons.untils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.Map;

/**
 * 该工具类是用于生成和解析JWT
 */
@Slf4j
public class JwtUtils {
    //密钥
    //准备密码
    private static final String SECRET_KEY =
            "jfdsakjdsfk%&JFDsfFDFADSFhj875421dsafhjafdsfdsalkjafdsafds";
    //指定有效期，以分钟为单位，有效期为7天
    private static final Long EXPIRED_IN_MINUTE = 7L * 24 * 60;

    //为了避免外部随意创建对象，将构造方法进行私有化
    private JwtUtils() {
    }

    //生成JWT的方法
    public static String generate(Map<String,Object> claim){
        //设置有效期
        Date date = new Date(System.currentTimeMillis() + EXPIRED_IN_MINUTE * 60 * 1000);

        String jwt = Jwts.builder()
                // Header：用于配置算法与此结果数据的类型
                // 通常配置2个属性：typ（类型）、alg（算法）
                .setHeaderParam("typ", "jwt")
                .setHeaderParam("alg", "HS256")
                // Payload：用于配置需要封装到JWT中的数据
                .setClaims(claim)
                //jwt有效期
                .setExpiration(date)
                // Signature：用于指定算法与密钥（盐）
                .signWith(SignatureAlgorithm.HS256,SECRET_KEY)
                .compact();
        return jwt;
    }

    //解析JWT
    public static Claims parse(String jwt){

        Claims body = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(jwt).getBody();
        return body;
    }

}
